package com.beiding.jsonanalyzer.analyze;

import com.beiding.jsonanalyzer.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 分组器
 */
 class Grouper {

//    private List<Object> groupRefers = new ArrayList<>();
//
//    private KeyMode keyMode = KeyMode.NORMAL;
//
//    /**
//     * 可使用任意对象分组
//     * 但只有Key分组时,才会在结果集中将其收集到
//     *
//     * @param refer
//     * @return
//     */
//    public Grouper by(Object refer) {
//
//        Object key = KeyUtils.handleKey(refer, keyMode);
//        this.groupRefers.addElement(key);
//        return this;
//    }
//
//    public Grouper keyMode(KeyMode keyMode) {
//        this.keyMode = keyMode;
//        return this;
//    }
//
//
//    //执行分组
//    public List<ValueNode> groupFor(List<ValueNode> nodes) {
//
//        //先进行排序
//        Orderer orderer = new Orderer();
//
//        for (Object groupRefer : groupRefers) {
//            orderer.by(groupRefer);
//        }
//
//        List<ValueNode> orderResult = orderer.orderFor(nodes);
//
//        List<ValueNode> groupNodes = new ArrayList<>();
//
//        //分组缓存
//        Map groupCache = new HashMap();
//
//        for (ValueNode node : orderResult) {
//            Object valueNode = node.getValue();
//
//            ValueNode groupNode = getGroupNode(groupCache, valueNode);
//
//            if (groupNode == null) {
//                groupNode = createGroupNode(groupCache, valueNode);
//                groupNodes.addElement(groupNode);
//            }
//
//            groupNode.getGroupNodes().addElement(node);
//        }
//
//        return groupNodes;
//
//    }
//
//    private ValueNode getGroupNode(Map groupCache, Object valueNode) {
//
//        //最后一层才是实际对象
//        int gSize = groupRefers.size() - 1;
//        Map last = groupCache;
//        for (int i = 0; i < gSize; i++) {
//            Object ck = ValueUtils.execExpression(valueNode, groupRefers.get(i), Object.class);
//            last = (Map) last.get(ck);
//            if (last == null) {
//                return null;
//            }
//        }
//        Object ck = ValueUtils.execExpression(valueNode, groupRefers.get(groupRefers.size() - 1), Object.class);
//
//        return (ValueNode) last.get(ck);
//
//    }
//
//
//    private ValueNode createGroupNode(Map groupCache, Object valueNode) {
//        int gSize = groupRefers.size() - 1;
//        Map last = groupCache;
//
//        /*
//            创建节点,节点的层次关系与原始行的层次关系一致
//            例如:
//            原始:
//                {
//                    a:{
//                        name:''
//                    },
//                    b:{
//                        name:''
//                    }
//                }
//            新创建的节点
//                {
//                    a:{
//                        name:''
//                    },
//                    $groupNodes:[//所有匹配的节点
//
//                    ]
//                }
//         */
//        ValueNode groupNode = new ValueNode();
//        groupNode.set(new ValueNode.AnalyzeJsonObject());
//        groupNode.setGroupNodes(new ArrayList<>());
//
//        for (int i = 0; i < gSize; i++) {
//            Object refer = groupRefers.get(i);
//
//            //获取缓存对象
//            Object ck = ValueUtils.execExpression(valueNode, refer, Object.class);
//
//            //只有refer为key才会放入对象
//            if (refer instanceof Key) {
//                Analyzer.set(groupNode.getValue(), refer, ck);
//            }
//
//            Map olast = last;
//
//            last = (Map) last.get(ck);
//            //创建分组对象
//            if (last == null) {
//                Map map = new HashMap();
//
//                //groupCache中存放的分组对象只与值有关
//                olast.executeOne(ck, map);
//                last = map;
//            }
//
//        }
//
//        Object refer = groupRefers.get(groupRefers.size() - 1);
//
//        Object ck = ValueUtils.execExpression(valueNode, refer, Object.class);
//        if (refer instanceof Key) {
//            Analyzer.set(groupNode.getValue(), refer, ck);
//        }
//        last.executeOne(ck, groupNode);
//
//        return groupNode;
//
//    }

}
